perm filename PICBUF.SAI[PIC,HE] blob
sn#428029 filedate 1979-03-25 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 ENTRY PAGFLT,GETBUF,FNDBUF,FREBUF,USEBUF,INDMP,UINDMP,OUTDMP,NHOUTDMP,GETPNT,PUTPNT,INPTR,OUTPTR,ROWS,COLMS,
C00030 ENDMK
C⊗;
ENTRY PAGFLT,GETBUF,FNDBUF,FREBUF,USEBUF,INDMP,UINDMP,OUTDMP,NHOUTDMP,GETPNT,PUTPNT,INPTR,OUTPTR,ROWS,COLMS,
BYTSZ,PAKCOL,BUFSZ,BUFST,THRHLD,SUPFAC,ISUBST,JSUBST,DMEAN,DSTDEV,BUFINIT,FORINIT;
BEGIN "PICBUF"
COMMENT THIS FILE IS A SAIL SIMULATION OF THE FAIL PICBUF ROUTINES
AT CMU;
SAFE INTERNAL INTEGER ARRAY ROWTAB,PICTAB,COLTAB,USETAB,HEDTAB,DIRTY,PAGFLT[0:16];
OWN INTEGER NUMPAG,NEWSSW,INITBUF;
define STANFORD= "true";
DEFINE ROWLOC=11,
COLLOC=2,
BYTLOC=1,
SUPLOC=7,
THRLOC=6,
MENLOC=8,
DEVLOC=9,
SIZLOC=4,
RSIZLOC=3,
SUBSTLOC=5,
RTABLOC=12,
TFILELOC=13,
CHANLOC=14,
MAXUSE=30;
REQUIRE "BAYSAI.SAI" SOURCE!FILE;
comment SOURCE!V(CORSER);
comment lib!v(corser);
REQUIRE "CORSER" SOURCE!FILE;
require "corser" library; require " LI"&"B!V(corser) " message;
IFC STANFORD THENC
require "tenexio.sai" source!file;
ENDC
DEFINE PAGED(BUF)="(USETAB[BUF]>0)";
FORWARD SIMPLE INTERNAL PROCEDURE BUFINIT;
DEFINE IINNIITT="BEGIN BUFINIT; PRINT(""You failed to initialize the buffers.
It was just done for you."",crlf) END;";
SIMPLE INTERNAL INTEGER PROCEDURE FNDBUF(INTEGER INDICATOR);
BEGIN
INTEGER I;
IF INITBUF=0 THEN IINNIITT;
FOR I←0 STEP 1 UNTIL 16 DO
IF USETAB[I]=0
THEN BEGIN
USETAB[I]←IF INDICATOR=0 THEN -2 ELSE IF INDICATOR>0 THEN NUMPAG ELSE INDICATOR;
RETURN(I);
END;
RETURN(-1);
END;
DEFINE ITRSIZ(BUFFER)="(MEMORY[HEDTAB[BUFFER]+RSIZLOC])";
DEFINE ITFSIZ(BUFFER)="(MEMORY[HEDTAB[BUFFER]+SIZLOC])";
DEFINE ITRT(BUFFER)="MEMORY[HEDTAB[BUFFER]+RTABLOC]";
DEFINE TFILE(BUFFER)="MEMORY[HEDTAB[BUFFER]+TFILELOC]";
DEFINE IOCHAN(BUFFER)="MEMORY[HEDTAB[BUFFER]+CHANLOC]";
DEFINE ITROWS(BUFFER)="(MEMORY[HEDTAB[BUFFER]+ROWLOC])";
DEFINE USC(BUFFER)="MEMORY[HEDTAB[BUFFER]]";
SIMPLE INTERNAL INTEGER PROCEDURE ROWS(INTEGER BUFFER);
RETURN(ITROWS(BUFFER));
DEFINE ITCOLMS(BUFFER)="(MEMORY[HEDTAB[BUFFER]+COLLOC])";
SIMPLE INTERNAL INTEGER PROCEDURE COLMS(INTEGER BUFFER);
RETURN(ITCOLMS(BUFFER));
SIMPLE INTERNAL INTEGER PROCEDURE BYTSZ(INTEGER BUFFER);
RETURN(MEMORY[HEDTAB[BUFFER]+BYTLOC]);
SIMPLE INTERNAL INTEGER PROCEDURE ISUBST(INTEGER BUFFER);
RETURN((MEMORY[HEDTAB[BUFFER]+SUBSTLOC]) LSH -18);
SIMPLE INTERNAL INTEGER PROCEDURE JSUBST(INTEGER BUFFER);
RETURN((MEMORY[HEDTAB[BUFFER]+SUBSTLOC]) LAND '777777);
SIMPLE INTERNAL INTEGER PROCEDURE SUPFAC(INTEGER BUFFER);
RETURN(MEMORY[HEDTAB[BUFFER]+SUPLOC]);
SIMPLE INTERNAL INTEGER PROCEDURE BUFSZ(INTEGER BUFFER);
RETURN(ITFSIZ(BUFFER));
SIMPLE INTERNAL INTEGER PROCEDURE DSTDEV(INTEGER BUFFER);
RETURN(MEMORY[HEDTAB[BUFFER]+DEVLOC]);
SIMPLE INTERNAL INTEGER PROCEDURE DMEAN(INTEGER BUFFER);
RETURN(MEMORY[HEDTAB[BUFFER]+MENLOC]);
SIMPLE INTERNAL INTEGER PROCEDURE THRHLD(INTEGER BUFFER);
RETURN(MEMORY[HEDTAB[BUFFER]+THRLOC]);
SIMPLE INTERNAL PROCEDURE PUTSUP(INTEGER SUPLEV,BUFFER);
MEMORY[HEDTAB[BUFFER]+SUPLOC]←SUPLEV;
SIMPLE INTERNAL PROCEDURE PUTSUB(INTEGER STI,STJ,BUFFER);
MEMORY[HEDTAB[BUFFER]+SUBSTLOC]←(STI LSH 18) LOR STJ;
SIMPLE INTERNAL PROCEDURE PUTDEV(INTEGER DEVLEV,BUFFER);
MEMORY[HEDTAB[BUFFER]+DEVLOC]←DEVLEV;
SIMPLE INTERNAL PROCEDURE PUTTHR(INTEGER THRLEV,BUFFER);
MEMORY[HEDTAB[BUFFER]+THRLOC]←THRLEV;
SIMPLE INTERNAL PROCEDURE PUTMEN(INTEGER MENLEV,BUFFER);
MEMORY[HEDTAB[BUFFER]+MENLOC]←MENLEV;
SIMPLE INTERNAL INTEGER PROCEDURE USEBUF(INTEGER BUFFER);
IF 0≤BUFFER≤16 THEN RETURN(PICTAB[BUFFER]) ELSE RETURN(0);
DEFINE REF(A)="MEMORY[BUFLOC+A]";
INTERNAL INTEGER PROCEDURE HDRIN(INTEGER CHAN, BUF);
BEGIN
INTEGER BUFLOC,DUM,TYP,ISIZZ,JSIZZ,USCBYT;
SAFE INTEGER ARRAY ARR[0:'25];
BUFLOC←GETZCORE(128);
ARRYIN(CHAN,MEMORY[BUFLOC],128);
USCBYT←0;
COMMENT DUPLICATE CHECK FOR USC FILES REMOVED FROM HERE IT WAS THE ALL 0 CHECK
NO LONGER NECESSARY;
IF (REF(0)=-1) AND (0<REF(1) ≤ 36) AND (REF(3)≤REF(4) AND REF(5)≤REF(6)) THEN TYP←3 ! SUAI;
ELSE IF (REF(5)≤'777777) AND (0<REF(2)≤36) AND (0<REF(3)≤36) AND (REF(4)=REF(0)*((REF(1)-1)%(36%REF(2))+1)) THEN TYP←2 ! SRI;
ELSE IF (0<REF(1)≤36) AND REF(0)=128 AND REF(5)≥'777777 THEN TYP←0
else begin ! NO HEADER;
IFC STANFORD THENC
PRINT("This is not a good file, will assume a file without header.
Give the dimensions please (a 0
indicates you do not wish this file).
I size: ");
isizz←CVD(INTTY);
IF ISIZZ≥0 THEN BEGIN PRINT("J size: "); JSIZZ←CVD(INTTY); PRINT("Bytesize: "); USCBYT←CVD(INTTY) END
ELSE BEGIN PRINT("This was an illegal image.",crlf); RETURN(0) END;
TYP←1; END;
ELSEC
GTFDB(CHAN,ARR);
USCBYT←(ARR['11] LSH -24) LAND '77;
JSIZZ←IF USCBYT=8 THEN ARR['12] ELSE ARR['12]*4;
ISIZZ←SQRT(JSIZZ);
IF JSIZZ=(ISIZZ*ISIZZ) THEN BEGIN JSIZZ←ISIZZ; USCBYT←8; TYP←1 END
ELSE BEGIN PRINT("This is not a good file, will assume a file without header.
But it is not a square image. Give the dimensions please (a 0
indicates you do not wish this file).
I size: ");
isizz←CVD(INTTY);
IF ISIZZ≥0 THEN BEGIN PRINT("J size: "); JSIZZ←CVD(INTTY); PRINT("Bytesize: "); USCBYT←CVD(INTTY) END
ELSE BEGIN PRINT("This was an illegal image.",crlf); RETURN(0) END;
TYP←1; END
end;
ENDC
CASE TYP OF BEGIN
; COMMENT STD CMU;
BEGIN COMMENT NO HEADER USC SQUARE FILES;
REF(0)←0;
REF(1)←IF USCBYT=0 THEN 8 ELSE USCBYT;
REF(2)←JSIZZ;
REF(3)←((JSIZZ-1)%(36%(IF USCBYT=0 THEN 8 ELSE USCBYT)))+1;
REF(4)←REF(3)*ISIZZ;
REF(5)←'1000001;
FOR DUM←6 STEP 1 UNTIL 10 DO REF(DUM)←0;
REF(ROWLOC)←ISIZZ;
FOR DUM←30 STEP 1 UNTIL 127 DO REF(DUM)←0;
END;
BEGIN REF(1) SWAP REF(2); COMMENT SRI FILES;
REF(3)←REF(4)%REF(0);
REF(5)←'1000001;
REF(0)←128 END;
BEGIN REF(0)←(REF(7)) LAND '777777; COMMENT SAIL IMAGE FILES;
REF(4)←REF(2)*(REF(4)-REF(3)+1);
DUM←REF(6)-REF(5)+1;
REF(6)←REF(7)←0;
REF(5)←(REF(3) LSH 18) LOR REF(5);
REF(3)←REF(2);
REF(2)←DUM END;
END;
MEMORY[BUFLOC+ROWLOC]←MEMORY[BUFLOC+SIZLOC]%MEMORY[BUFLOC+RSIZLOC];
SMEAR(BUFLOC+RTABLOC,MAXUSE-RTABLOC,0);
SWDPTR(CHAN,REF(0));
RETURN(BUFLOC);
END;
INTERNAL PROCEDURE INOUT(INTEGER IC,OC,NUM);
BEGIN
SAFE INTEGER ARRAY BUFR[0:127];
INTEGER I;
FOR I←128 STEP 128 UNTIL NUM DO
BEGIN
ARRYIN(IC,BUFR[0],128);
ARRYOUT(OC,BUFR[0],128);
END;
I←NUM-(I-128);
IF I>0 THEN BEGIN
ARRYIN(IC,BUFR[0],I);
ARRYOUT(OC,BUFR[0],I);
END;
END;
SIMPLE STRING PROCEDURE NEWNAM(INTEGER BUF);
IFC STANFORD THENC
RETURN("BUF"&CVS(BUF)&"-"&CV6STR(CALL(0,"GETLN"))&".TMP");
ELSEC
RETURN("BUF"&CVS(BUF)&"-"&CVS(GJINF(0,0,0))&".TMP");
ENDC
SIMPLE INTERNAL INTEGER PROCEDURE ALLOCPIC(INTEGER BUF);
BEGIN
INTEGER SIZEC,LOCC;
PAGFLT[BUF]←0;
SIZEC←MEMORY[HEDTAB[BUF]+SIZLOC];
IF PAGED(BUF) AND (SIZEC<1024) THEN USETAB[BUF]←-1;
IF USETAB[BUF]=-2
THEN USETAB[BUF]←IF ('377000<(2*SIZEC+HEDTAB[BUF])) OR SIZEC>35000 THEN NUMPAG ELSE -1;
IF PAGED(BUF) AND (SIZEC<1024) THEN USETAB[BUF]←-1;
IF PAGED(BUF) THEN SIZEC←USETAB[BUF]*(ITRSIZ(BUF)+1);
IF NEWSSW THEN PRINT("Allocated ",SIZEC," words of core.",IF PAGED(BUF) THEN "(paged)" else "(incore)",CRLF);
LOCC←IF PAGED(BUF) THEN GETZCORE(SIZEC) ELSE GETCORE(SIZEC);
MEMORY[HEDTAB[BUF]+RTABLOC]←LOCC+SIZEC-USETAB[BUF];
RETURN(LOCC)
END;
SIMPLE INTERNAL INTEGER PROCEDURE RCTABS(INTEGER BUF);
BEGIN
INTEGER INITPTR,I,J;
ROWTAB[BUF]←GETCORE(ROWS(BUF));
COLTAB[BUF]←GETCORE(COLMS(BUF));
INITPTR←POINT(BYTSZ(BUF),MEMORY[PICTAB[BUF]],-1);
INITPTR←INITPTR-PICTAB[BUF];
FOR I←1 STEP 1 UNTIL COLMS(BUF) DO
BEGIN
MEMORY[COLTAB[BUF]+I-1]←INITPTR;
IBP(INITPTR);
END;
IF PAGED(BUF)
THEN BEGIN
SMEAR(ROWTAB[BUF],ITROWS(BUF),0);
INITPTR←ITRT(BUF);
FOR I←0 THRU USETAB[BUF]-1 DO
MEMORY[INITPTR+I]←-(PICTAB[BUF]+I*ITRSIZ(BUF));
END
ELSE FOR J←1 STEP 1 UNTIL ROWS(BUF) DO
MEMORY[ROWTAB[BUF]+J-1]←PICTAB[BUF]+(J-1)*ITRSIZ(BUF);
END;
FORWARD SIMPLE INTERNAL PROCEDURE FREBUF(INTEGER BUF);
SIMPLE INTERNAL PROCEDURE INDMP(STRING DEV, FILE; INTEGER BUF; REFERENCE INTEGER FLAG);
BEGIN
INTEGER CHAN;
IF INITBUF=0 THEN IINNIITT;
WHILE TRUE DO BEGIN
CHAN←OPENFILE(FILE,"RCE");
IF CHAN ≠-1 THEN DONE;
IF FLAG=-2 THEN BEGIN IF ¬ USEBUF(BUF) THEN FREBUF(BUF);
FLAG←-1; RETURN END;
PRINT("FILE NOT FOUND: ",FILE," NEW NAME: ");
FILE←INTTY;
IF LENGTH(FILE)=0 THEN BEGIN IF NOT USEBUF(BUF) THEN FREBUF(BUF);
FLAG←-1; RETURN; END;
END;
IF (HEDTAB[BUF]←HDRIN(CHAN,BUF))=0 THEN BEGIN IF ¬ USEBUF(BUF) THEN FREBUF(BUF);
FLAG←-1; RETURN END;
PICTAB[BUF]←ALLOCPIC(BUF);
RCTABS(BUF);
IF PAGED(BUF) THEN
ELSE ARRYIN(CHAN,MEMORY[PICTAB[BUF]],ITFSIZ(BUF));
IF PAGED(BUF) THEN IOCHAN(BUF)←CHAN
ELSE CFILE(CHAN);
FLAG←0;
END;
SIMPLE INTERNAL PROCEDURE UINDMP(STRING DEV, FILE; INTEGER BUF; REFERENCE INTEGER FLAG; INTEGER SIZZ);
BEGIN
INTEGER CHAN,ISIZZ,JSIZZ;
IF INITBUF=0 THEN IINNIITT;
CHAN←OPENFILE(FILE,"RC");
JSIZZ←SIZZ LAND '777777;
ISIZZ←SIZZ LSH -18;
IF ISIZZ=0 THEN ISIZZ←JSIZZ;
HEDTAB[BUF]←GETZCORE(128);
MEMORY[HEDTAB[BUF]]←0;
MEMORY[HEDTAB[BUF]+1]←8;
MEMORY[HEDTAB[BUF]+2]←JSIZZ;
MEMORY[HEDTAB[BUF]+3]←((JSIZZ-1)%(36%8))+1;
MEMORY[HEDTAB[BUF]+4]←MEMORY[HEDTAB[BUF]+3]*ISIZZ;
MEMORY[HEDTAB[BUF]+5]←(1 LSH 18) LOR 1;
FOR DUM←6 STEP 1 UNTIL 10 DO MEMORY[HEDTAB[BUF]+DUM]←0;
MEMORY[HEDTAB[BUF]+ROWLOC]←SIZZ;
PICTAB[BUF]←ALLOCPIC(BUF);
RCTABS(BUF);
IF PAGED(BUF) THEN
ELSE ARRYIN(CHAN,MEMORY[PICTAB[BUF]],ITFSIZ(BUF));
IF PAGED(BUF) THEN IOCHAN(BUF)←CHAN
ELSE CFILE(CHAN);
FLAG←0;
END;
DEFINE ROWP(I)="MEMORY[ROWTAB[BUF]+I-1]",
COLP(J)="MEMORY[COLTAB[BUF]+J-1]";
SIMPLE INTERNAL PROCEDURE ROWOUT(INTEGER I,BUF);
BEGIN
INTEGER WPR,IC;
SWDPTR(IC←IOCHAN(BUF),USC(BUF)+(WPR←ITRSIZ(BUF))*(I-1));
ARRYOUT(IC,MEMORY[ROWP(I)],WPR);
END;
DEFINE RR(A)="MEMORY[HEDTAB[BUF]+A]";
INTERNAL PROCEDURE NHOUTDMP(STRING DEV, FILE; INTEGER BUF; REFERENCE INTEGER FLAG);
BEGIN
INTEGER CHAN,TCHAN,I;
SAFE INTEGER ARRAY ARR[0:'25];
FLAG←0;
CHAN←OPENFILE(FILE,"WC");
IF PAGED(BUF) THEN BEGIN TCHAN←IOCHAN(BUF);
IF DIRTY[BUF] THEN FOR I←1 THRU USETAB[BUF] DO
IF (DUM←MEMORY[ITRT(BUF)+I-1])≠0 THEN ROWOUT(DUM,BUF);
SWDPTR(TCHAN,USC(BUF));
INOUT(TCHAN,CHAN,ITFSIZ(BUF));
DIRTY[BUF]←0;
END
ELSE ARRYOUT(CHAN,MEMORY[PICTAB[BUF]],ITFSIZ(BUF));
IFC NOT STANFORD THENC
CLOSF(CHAN);
GTFDB(CHAN,ARR);
IF ((ARR['11] LSH -24) LAND '77)=36
THEN BEGIN
CHFDB(CHAN,'11,'007700000000,'001000000000);
CHFDB(CHAN,'12,-1,ARR['12]*4);
END;
ENDC
CFILE(CHAN);
END;
INTERNAL PROCEDURE OUTDMP(STRING DEV, FILE; INTEGER BUF; REFERENCE INTEGER FLAG);
BEGIN
INTEGER CHAN,DUM,I,OUSCBUF;
SAFE INTEGER ARRAY TARR[0:127];
IF FLAG=1 THEN BEGIN NHOUTDMP(DEV,FILE,BUF,FLAG); FLAG←0; RETURN END;
IF PAGED(BUF) AND TFILE(BUF) THEN CHAN←IOCHAN(BUF)
ELSE CHAN←OPENFILE(FILE,"WC");
OUSCBUF←USC(BUF);
USC(BUF)←128;
IF PAGED(BUF) THEN BEGIN
IF DIRTY[BUF] THEN FOR I←1 THRU USETAB[BUF] DO
IF (DUM←MEMORY[ITRT(BUF)+I-1])≠0 THEN ROWOUT(DUM,BUF);
DIRTY[BUF]←0;
END
ELSE BEGIN
SWDPTR(CHAN,128);
ARRYOUT(CHAN,MEMORY[PICTAB[BUF]],ITFSIZ(BUF));
END;
ARRBLT(TARR[0],MEMORY[HEDTAB[BUF]],128);
CASE FLAG OF BEGIN
;;
BEGIN TARR[1] SWAP TARR[2];
TARR[5]←1;
TARR[0]←TARR[11];
TARR[3]←TARR[2];
FOR I←6 STEP 1 UNTIL 30 DO TARR[I]←0 END;
BEGIN TARR[0]←-1; TARR[7]←((-TARR[4]) LSH 18) LOR 128;
TARR[6]←(TARR[5] LAND '777777)+TARR[2]-1;
TARR[2]←TARR[3];
TARR[3]←TARR[5] LSH -18;
TARR[5]←TARR[5] LAND '777777;
TARR[4]←TARR[3]+TARR[11]-1;
FOR I←8 STEP 1 UNTIL 30 DO TARR[I]←0 END;
END;
SWDPTR(CHAN,0);
ARRYOUT(CHAN,TARR[0],128);
FLAG←0;
IF PAGED(BUF) THEN IF TFILE(BUF) THEN BEGIN
do begin
RENAME(CHAN,FILE,'155,DUM←0);
if dum then begin print("Illegal name ",file,crlf,"New name: ");
file←intty end;
end until dum=0;
TFILE(BUF)←0
END
ELSE BEGIN
INTEGER OC;
OC←IOCHAN(BUF);
SWDPTR(OC,OUSCBUF);
INOUT(OC,CHAN,ITFSIZ(BUF));
USC(BUF)←OUSCBUF;
CFILE(CHAN)
END
ELSE CFILE(CHAN);
END;
SIMPLE INTERNAL PROCEDURE FREBUF(INTEGER BUF);
BEGIN
IF USETAB[BUF] =0 THEN RETURN;
IF PAGED(BUF) THEN BEGIN
IF TFILE(BUF) THEN BEGIN
IFC STANFORD THENC RENAME(IOCHAN(BUF),NULL,0,0); END;
ELSEC
CLOSF(IOCHAN(BUF));
DELNF(IOCHAN(BUF),0)
END;
ENDC
CFILE(IOCHAN(BUF))
END;
USETAB[BUF]←0;
IF PICTAB[BUF]=0 THEN RETURN;
RELCORE(COLTAB[BUF]);
RELCORE(ROWTAB[BUF]);
RELCORE(PICTAB[BUF]);
RELCORE(HEDTAB[BUF]);
PICTAB[BUF]←0;
if newssw then print("Deallocated buffer",crlf);
END;
SIMPLE INTERNAL PROCEDURE ROWIN(INTEGER I,BUF);
BEGIN "ROWIN"
INTEGER II,ROWCLOC,I1,PTR,WPR,OI;
PTR←ITRT(BUF);
OI←MEMORY[PTR+(II←USETAB[BUF]-1)];
IF OI<0
THEN ROWCLOC←-OI
ELSE BEGIN
ROWCLOC←ROWP(OI);
IF DIRTY[BUF] THEN ROWOUT(OI,BUF);
ROWP(OI)←0;
END;
FOR I1←II DOWNTO 1 DO
MEMORY[PTR+I1]←MEMORY[PTR+I1-1];
MEMORY[PTR]←I;
ROWP(I)←ROWCLOC;
SWDPTR(II←(IOCHAN(BUF)),USC(BUF)+(WPR←ITRSIZ(BUF))*(I-1));
ARRYIN(II,MEMORY[ROWCLOC],WPR);
PAGFLT[BUF]←PAGFLT[BUF]+1;
IF !SKIP! THEN BEGIN "NOEX"
SWDPTR(II,USC(BUF)+WPR*(I-1));
SMEAR(ROWCLOC,WPR,0);
ARRYIN(II,MEMORY[ROWCLOC],WPR) END;
END;
DEFINE SORT(I,BUF)="BEGIN
INTEGER PTR,II,TMP;
PTR←ITRT(BUF);
FOR II←0 THRU USETAB[BUF]-1 DO
IF MEMORY[PTR+II]=I THEN DONE;
TMP←MEMORY[PTR+II];
FOR II←II DOWNTO 1 DO
MEMORY[PTR+II]←MEMORY[PTR+II-1];
MEMORY[PTR]←TMP;
END";
DEFINE INPPAG="IF PAGED(BUF) THEN
IF NOT(ROWP(I)) THEN ROWIN(I,BUF) ELSE SORT(I,BUF);";
DEFINE OUPPAG="IF PAGED(BUF) THEN BEGIN
IF NOT(TFILE(BUF)) THEN BEGIN
INTEGER IC,OC;
IC←IOCHAN(BUF);
IOCHAN(BUF)←OC←OPENFILE(NEWNAM(BUF),""WRC"");
SWDPTR(IC,USC(BUF));
USC(BUF)←128;
ARRYOUT(OC,MEMORY[HEDTAB[BUF]],128);
INOUT(IC,OC,ITFSIZ(BUF));
CFILE(IC);
TFILE(BUF)←-1;
END;
IF NOT(ROWP(I)) THEN ROWIN(I,BUF)
ELSE SORT(I,BUF);
DIRTY[BUF]←-1;
END;";
SIMPLE INTERNAL INTEGER PROCEDURE INPTR(INTEGER I,J,BUF);
BEGIN
INPPAG;
RETURN(ROWP(I)+COLP(J));
END;
SIMPLE INTERNAL INTEGER PROCEDURE OUTPTR(INTEGER I,J,BUF);
BEGIN
OUPPAG;
RETURN(ROWP(I)+COLP(J));
END;
REDEFINE SORT(I,BUF)="";
SIMPLE INTERNAL INTEGER PROCEDURE GETPNT(INTEGER I,J,BUF);
BEGIN
INPPAG;
RETURN(ILDB(DUM←ROWP(I)+COLP(J)));
END;
SIMPLE INTERNAL PROCEDURE PUTPNT(INTEGER I,J,VAL,BUF);
BEGIN
OUPPAG;
IDPB(VAL,DUM←ROWP(I)+COLP(J));
END;
INTERNAL PROCEDURE GETBUF(INTEGER I,J,BYT,BUF);
BEGIN
INTEGER SME;
IF INITBUF=0 THEN IINNIITT;
IF BYT<0 THEN BEGIN BYT←-BYT; SME←-1 END ELSE SME←0;
HEDTAB[BUF]←GETZCORE(128);
MEMORY[HEDTAB[BUF]]←128;
MEMORY[HEDTAB[BUF]+1]←BYT;
MEMORY[HEDTAB[BUF]+2]←J;
MEMORY[HEDTAB[BUF]+3]←((J-1)%(36%BYT))+1;
MEMORY[HEDTAB[BUF]+4]←MEMORY[HEDTAB[BUF]+3]*I;
MEMORY[HEDTAB[BUF]+5]←(1 LSH 18) LOR 1;
FOR DUM←6 STEP 1 UNTIL 10 DO MEMORY[HEDTAB[BUF]+DUM]←0;
MEMORY[HEDTAB[BUF]+ROWLOC]←I;
PICTAB[BUF]←ALLOCPIC(BUF);
IF PAGED(BUF)
THEN BEGIN
IOCHAN(BUF)←OPENFILE(NEWNAM(BUF),"RWC");
TFILE(BUF)←-1;
SWDPTR(IOCHAN(BUF),128);
BEGIN
SAFE INTEGER ARRAY BUFR[0:127];
INTEGER I,NUM,OC;
OC←IOCHAN(BUF);
NUM←ITFSIZ(BUF);
ARRCLR(BUFR,SME);
FOR I←128 STEP 128 UNTIL NUM DO
ARRYOUT(OC,BUFR[0],128);
I←NUM-(I-128);
IF I>0 THEN ARRYOUT(OC,BUFR[0],I);
END;
END
ELSE SMEAR(PICTAB[BUF],ITFSIZ(BUF),SME);
RCTABS(BUF);
END;
SIMPLE INTERNAL PROCEDURE GETHDR(SAFE INTEGER ARRAY HDRARR; INTEGER BUF);
BEGIN "GETHDR"
INTEGER I;
! FOR I←0 STEP 1 UNTIL 127 DO HDRARR[I]←MEMORY[HEDTAB[BUF]+I];
ARRBLT(HDRARR[0],MEMORY[HEDTAB[BUF]],128);
END;
SIMPLE INTERNAL PROCEDURE PUTHDR(SAFE INTEGER ARRAY HDRARR; INTEGER BUF);
BEGIN "PUTHDR"
INTEGER I;
FOR I←0 STEP 1 UNTIL MAXUSE DO IF HDRARR[I]≠MEMORY[HEDTAB[BUF]+I]
THEN PRINT("UGH. CHANGING HEADER ENTRY ",I," YOU CAN'T DO THAT! ",
"FOR ENTRIES LESS THAN ",MAXUSE,CRLF);
FOR I←MAXUSE+1 STEP 1 UNTIL 127 DO MEMORY[HEDTAB[BUF]+I]←HDRARR[I];
END;
SIMPLE INTERNAL PROCEDURE COPHDR(INTEGER INHBUF,OUTHBUF);
ARRBLT(MEMORY[HEDTAB[OUTHBUF]+MAXUSE],MEMORY[HEDTAB[INHBUF]+MAXUSE],128-MAXUSE);
SIMPLE INTERNAL PROCEDURE BUFINIT;
BEGIN
IF INITBUF THEN BEGIN PRINT("You alread initialized it.",crlf);
return; end;
ARRCLR(ROWTAB);
ARRCLR(PICTAB);
ARRCLR(COLTAB);
ARRCLR(USETAB);
ARRCLR(HEDTAB);
NUMPAG←10;
NEWSSW←0;
initbuf←-1;
END;
SIMPLE INTERNAL PROCEDURE FORINIT;
BEGIN INITBUF←0; BUFINIT END;
SIMPLE INTERNAL PROCEDURE NEWS(INTEGER VAR);
NEWSSW←VAR;
SIMPLE INTERNAL PROCEDURE PAGSET(INTEGER PAGNO);
NUMPAG←PAGNO;
EXTERNAL PROCEDURE CROPPL(INTEGER BUFF,OBUF,SI,EI,SJ,EJ,PI,PJ);
SIMPLE INTERNAL PROCEDURE COPY(INTEGER INBUF, OUTBUF);
BEGIN
CROPPL(INBUF,OUTBUF,1,ROWS(INBUF),1,COLMS(INBUF),1,1);
END;
END